跳到主要内容

Go 套接字 Socket 编程 - 基本元素

Go 的网络包是由以下元素组成的

IP 类型相关

可以用它来计算掩码之类的东西,或者取得它的网络地址

import (
"fmt"
"net"
)

func main() {
addr := net.ParseIP("127.0.0.1")
mask := addr.DefaultMask()
network := addr.Mask(mask)
ones, bits := mask.Size()
fmt.Println(
" Address is ", addr.String(),
"\n Default mask length is ", bits,
"\n Leading ones count is ", ones,
"\n Mask is (hex) ", mask.String(),
"\n Network is ", network.String())
}

output

 Address is  127.0.0.1 
Default mask length is 32
Leading ones count is 8
Mask is (hex) ff000000
Network is 127.0.0.0

IPAddr 类型(DNS 查找)

IPAddr 类型内部就是一个 IP 地址

type IPAddr struct {
IP IP
Zone string // IPv6 scoped addressing zone
}

这种类型的主要用途是通过 IP 主机名执行 DNS 查找。

import (
"fmt"
"net"
"os"
)

func main() {
addr, err := net.ResolveIPAddr("ip", "baidu.com")
if err != nil {
fmt.Println("Resolution error", err.Error())
os.Exit(1)
}

fmt.Println("Resolved address is ", addr.String())
}

output:

Resolved address is  220.181.38.251

然而,通常主机如果有多个网卡,则可以有多个 IP 地址。所以可以使用 LookupHost

import (
"fmt"
"net"
"os"
)

func main() {
addrs, err := net.LookupHost("baidu.com")
if err != nil {
fmt.Println("Error ", err.Error())
os.Exit(1)
}

for _, s := range addrs {
fmt.Println(s)
}
}

output:

220.181.38.251
220.181.38.148
14.215.178.80
110.242.68.134
220.181.33.31
180.76.76.92
112.80.248.64
240e:bf:b801:1002:0:ff:b024:26de
240e:940:603:4:0:ff:b01b:589a

Port 系统的默认端口

在 Unix 系统中,在 /etc/services 文件里面列出了常用的端口。

$ more  /etc/services
tcpmux 1/tcp # TCP port service multiplexer
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
....

Go 语言有一个函数可以获取该文件。

func LookupPort(network, service string) (port int, err os.Error)

可以通过服务名取得默认端口

import (
"fmt"
"net"
"os"
)

func main() {
networkType := "tcp" // udp 和 tcp 端口是不一样的
service := "mysql"
port, err := net.LookupPort(networkType, service)

if err != nil {
fmt.Println("Error: ", err.Error())
os.Exit(2)
}

fmt.Println("Service port ", port)
}